package io.youngledo.usb.storage;

/// 存储配置记录类
///
/// 包含各种云存储服务的连接配置信息，使用Record简化数据结构。
///
/// ## 参数说明
/// - `type` - 存储服务类型
/// - `endpoint` - 服务端点URL
/// - `accessKey` - 访问密钥ID
/// - `secretKey` - 访问密钥Secret
/// - `region` - 地域，参考 [阿里云OSS地域说明](https://help.aliyun.com/zh/oss/regions-and-endpoints?spm=a2c4g.11186623.0.0.14f66e96CNKzTs)
/// - `useSSL` - 是否使用SSL连接
/// - `bucketName` - 存储桶名称（可选）
///
/// ## 使用示例
/// ```java
/// // 创建MinIO配置
/// var config = StorageConfig.createMinIOConfig(
///     "localhost:9000", "admin", "password", "us-east-1", false);
///
/// // 创建阿里云OSS配置
/// var ossConfig = StorageConfig.createOSSConfig(
///     "oss-cn-hangzhou.aliyuncs.com", "accessKey", "secretKey");
/// ```
public record StorageConfig(
        StorageType type,
        String endpoint,
        String accessKey,
        String secretKey,
        String region,
        boolean useSSL,
        String bucketName // 可选，某些云服务可能需要预先指定bucket
) {

    // 验证配置是否有效
    public boolean isValid() {
        boolean basicValid = type != null &&
                endpoint != null && !endpoint.trim().isEmpty() &&
                accessKey != null && !accessKey.trim().isEmpty() &&
                secretKey != null && !secretKey.trim().isEmpty();

        // 对于云服务，region通常是必需的，但对于MinIO等自部署服务，region是可选的
        if (basicValid && type != StorageType.MINIO) {
            // 对于云服务，检查region是否为空
            return region != null && !region.trim().isEmpty();
        }

        return basicValid;
    }

    // 获取完整的URL（主要用于S3兼容服务）
    public String getUrl() {
        if (type == StorageType.MINIO) {
            String protocol = useSSL ? "https://" : "http://";
            return protocol + endpoint;
        }
        // 对于云服务，通常直接使用endpoint
        return endpoint;
    }

    // 隐藏敏感信息的toString方法
    @Override
    public String toString() {
        return "StorageConfig{" +
                "type=" + type +
                ", endpoint='" + endpoint + '\'' +
                ", accessKey='" + accessKey + '\'' +
                ", secretKey='***'" +
                ", region='" + region + '\'' +
                ", useSSL=" + useSSL +
                ", bucketName='" + bucketName + '\'' +
                '}';
    }

    // 创建MinIO配置的便捷方法
    public static StorageConfig createMinIOConfig(String endpoint, String accessKey,
                                                  String secretKey, String region, boolean useSSL) {
        return new StorageConfig(StorageType.MINIO, endpoint, accessKey, secretKey,
                region, useSSL, null);
    }

    // 创建阿里云OSS配置的便捷方法
    public static StorageConfig createOSSConfig(String endpoint, String accessKey,
                                                String secretKey) {
        return new StorageConfig(StorageType.ALIYUN_OSS, endpoint, accessKey, secretKey,
                null, true, null);
    }

    // 创建腾讯云COS配置的便捷方法
    public static StorageConfig createCOSConfig(String region, String accessKey,
                                                String secretKey) {
        return new StorageConfig(StorageType.TENCENT_COS, region, accessKey, secretKey,
                region, true, null);
    }

    // 创建华为云OBS配置的便捷方法
    public static StorageConfig createOBSConfig(String endpoint, String accessKey,
                                                String secretKey) {
        return new StorageConfig(StorageType.HUAWEI_OBS, endpoint, accessKey, secretKey,
                null, true, null);
    }
}